package chatGUI;

import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.EventListener;
import javax.swing.event.*;

import chatControler.ChatControler;
import chatModel.Choix;
import chatModel.UtilisateurDistant;
import static javax.swing.ScrollPaneConstants.*;


/**
 * Classe qui gère les actions sur le GUI quand l'utilisateur est connecté
 * C'est un Pannel qui contient toute la zone utilisable par l'utilisateur
 */
public class EcrandeTravail extends JPanel implements ActionListener,MouseListener{

	protected int etat;
	protected ChatControler chatControler;
	protected String pseudo;
	protected JLabel lPseudo ;
	protected JButton bSendFichier = new JButton("Joindre un fichier ");
	protected JButton bSendMsg = new JButton(" Envoyer");
	protected JButton deconnect = new JButton(" Se deconnecter");
	protected JTabbedPane ongletsConversation = new JTabbedPane(SwingConstants.TOP);

	protected JTextArea aireEmission = new JTextArea (5,40);
	protected DefaultListModel liste;
	protected JList personneliste ;
	
	protected JPanel notifPanel = new JPanel();
	protected JTextArea notification = new JTextArea(4,46);
	protected JScrollPane scrollNotif;
	protected JPanel panNotif;
	protected GridLayout zonenotif;
	protected JPanel chatFenetreSouth;
	protected JPanel chatFenetre;
	
	protected GridLayout zoneDuBas;
	protected GridLayout zoneDeBasDroite;
	protected JPanel basFenetre;
	protected JPanel basDroiteFenetre;
	protected JPanel lesboutons2;
	protected Window cadre2 = new javax.swing.JFrame();
        
        /**
         * Constructeur
         * @param pseudo : Nom de l'utilisateur local 
         * @param chatControler : ChatControler du ChatSystem
         */
	public EcrandeTravail(String pseudo,ChatControler chatControler) {
		this.chatControler = chatControler;
		this.initComponent();
	}
        
        /**
         * Initialise les composants du panel de travail pour l'affichage
         */
	public void initComponent(){

		this.setBackground(new Color(220,220,200));
		this.pseudo=pseudo;
		this.liste = this.chatControler.getMsgToGui().getListeUser(); 
		this.personneliste  = new JList (liste);
		this.etat=Choix.etatConnected;
		
		this.setLayout(new BorderLayout(6, 5));
		this.lPseudo = new JLabel(pseudo);
		this.zoneDuBas = new GridLayout(1, 1);
		this.zoneDeBasDroite = new GridLayout(2,1);
		this.basFenetre = new JPanel(zoneDuBas);
		this.basDroiteFenetre = new JPanel(zoneDeBasDroite);
		this.zonenotif = new GridLayout(1,1);
		this.chatFenetreSouth = new JPanel(zonenotif);
		this.chatFenetre = new JPanel();
		this.panNotif = new JPanel();
		this.chatFenetre.setLayout(new BorderLayout(6, 5));
		this.panNotif.setLayout(new BorderLayout(6, 5));
		this.lesboutons2 = new JPanel();
		this.lesboutons2.setBackground(new Color(235,235,235));
		this.personneliste.setBackground(new Color(250,250,250));
		this.aireEmission.setBackground(new Color(250,250,250));
		this.notification.setBackground(new Color(250,250,250));
		this.lesboutons2.add(deconnect);
		add(lesboutons2, BorderLayout.NORTH);
		deconnect.addActionListener(this);

		this.notification.setEditable(false);
		this.notification.setLineWrap(true);
		this.scrollNotif = new JScrollPane(notification, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		
		// pouvoir aller à la ligne 
		this.aireEmission.setLineWrap(true);
		this.aireEmission.setPreferredSize(new Dimension(355,75));
		this.aireEmission.setMaximumSize(new Dimension(355,75));
		this.aireEmission.setMinimumSize(new Dimension(355,75));

		this.basDroiteFenetre.add(bSendMsg);
		this.basDroiteFenetre.add(bSendFichier);
		this.basFenetre.add(aireEmission);
		this.basFenetre.add(basDroiteFenetre);
		
		this.panNotif.add(notifPanel,BorderLayout.WEST);
		this.panNotif.add(scrollNotif,BorderLayout.WEST);
		this.chatFenetreSouth.add(panNotif);
		this.chatFenetre.add(this.chatFenetreSouth, BorderLayout.SOUTH);
		this.chatFenetre.add(this.ongletsConversation, BorderLayout.CENTER);
		
		this.add(this.personneliste, BorderLayout.EAST);
		this.add(this.chatFenetre, BorderLayout.WEST);
		this.add(basFenetre,BorderLayout.SOUTH);
		this.bSendFichier.addActionListener(this);
		this.bSendMsg.addActionListener(this);
		this.personneliste.addMouseListener(this);
		Onglet onglet = new Onglet(this.liste.get(0).toString());
		this.ongletsConversation.add(this.liste.get(0).toString(), onglet);
		this.ongletsConversation.setOpaque(true);
		this.ongletsConversation.addMouseListener(this);
	}
	
        /**
         * Appelée pour les clics sur les boutons
         * @param e 
         */
	public void actionPerformed(ActionEvent e) {
		//quand on envoie un message on l'affiche dans l'onglet actif
		if (e.getSource() == bSendMsg){
			String nameOnglet = ((Onglet)this.ongletsConversation.getSelectedComponent()).getNomOnglet();
			//Ecrire methode envoyerMsg dans le controler !!
			this.chatControler.envoyerMsg(nameOnglet, aireEmission.getText());
			// réinitialiser le texte 
			aireEmission.setText("");
		}
		if(e.getSource()==bSendFichier){
			System.out.println("etat en cours : " + this.etat + "egal à connecté  : "+Choix.etatConnected);
			if(this.etat==Choix.etatConnected){
				String nameOnglet = ((Onglet)this.ongletsConversation.getSelectedComponent()).getNomOnglet();
				JFileChooser fichierChoisi = new JFileChooser();
				String userDistant = ((Onglet)this.ongletsConversation.getSelectedComponent()).getNomOnglet();
				int resultat = fichierChoisi.showOpenDialog(this);
				if (resultat == JFileChooser.APPROVE_OPTION) {
					this.chatControler.envoyerDemandeFile(nameOnglet, fichierChoisi.getSelectedFile());
					System.out.println("Vous souhaitez envoyer le fichier qui suit à " + userDistant + "\n"
							+ fichierChoisi.getSelectedFile().getName());
				}
			}
			else{
				((Onglet)this.ongletsConversation.getSelectedComponent()).getAireReception().append("*** Vous ne pouvez pas envoyer de fichier, car vous êtes déjà en train d'en envoyer un, ou d'en recevoir un. ***\n");
			}
		}
		if (e.getSource() == deconnect){
			int resultat = JOptionPane.showConfirmDialog(this,
					"Voulez vous vraiment vous déconnecter ?",
					"Avertissment", 
					JOptionPane.YES_NO_OPTION);
			if (resultat == JOptionPane.YES_OPTION) {
				this.chatControler.setConnected(false);
			}
		}
	}   
        
        /**
         * Appelé pour les clics sur les onglets
         * @param e 
         */
	public void mouseClicked ( MouseEvent e){

		//si on clique sur une personne de la liste des connectés une fenetre de confirmation s'ouvre pour démarrer une conversation avec lui
		if ((e.getButton()==MouseEvent.BUTTON1)&&(e.getClickCount()==1)&& (e.getSource() == personneliste)){
			boolean existe = false;
			int ongletExistant=0;
			String nomDest = (String) liste.elementAt(personneliste.locationToIndex(e.getPoint()));
			while((ongletExistant<this.ongletsConversation.getTabCount())&& !existe){
				if(((Onglet)this.ongletsConversation.getComponent(ongletExistant)).getNomOnglet().compareTo(nomDest)==0){
					existe=true;
					this.ongletsConversation.setSelectedIndex(ongletExistant);
				}
				ongletExistant++;
			}
			if(!existe){
				int resultat = JOptionPane.showConfirmDialog(this,"Voulez vous commencez une discution avec "+nomDest+" ?");
				if (resultat == 0){
					Onglet onglet = new Onglet(nomDest);
					this.ongletsConversation.addTab(onglet.getNomOnglet(), onglet);
					//onglet.getAireReception().append("ChatSystem : Pour fermer l'onglet, veuillez faire un clic droit dessus \n");
					this.ongletsConversation.setSelectedComponent(onglet);
				}
			}
			
		}//si on fait un clic droit sur l'onglet de conversation, un fenetre de confirmation s'ouvre pour savoir si on veut la fermer
		if((e.getButton()==MouseEvent.BUTTON3)&&(e.getSource()==ongletsConversation)){
			int i = this.ongletsConversation.getUI().tabForCoordinate(this.ongletsConversation, e.getX(),e.getY());
			if (i !=-1){
				int choice = JOptionPane.showConfirmDialog(this,
						"Voulez vous fermer votre discution avec "+((Onglet)this.ongletsConversation.getComponent(i)).getNomOnglet()+" ?");
				if (choice == 0){
					this.ongletsConversation.remove(i);
				}
			}
		}
	}

	public void mouseEntered ( MouseEvent  e){			
	}

	public void mouseExited ( MouseEvent e ){
	}

	public void mousePressed ( MouseEvent e ){
	}

	public void mouseReleased ( MouseEvent e ){
	}



}
